home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / TCPDUMP.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-29  |  2.0 KB  |  83 lines

  1. /* TCP header tracing routines
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "netuser.h"
  7. #include "internet.h"
  8. #include "tcp.h"
  9. #include "trace.h"
  10.  
  11. #if !defined(_lint)
  12. static char rcsid[] OPTIONAL = "$Id: tcpdump.c,v 1.11 1996/08/29 12:11:16 root Exp root $";
  13. #endif
  14.  
  15. /* TCP segment header flags */
  16. static const char *Tcpflags[] = {
  17.     "FIN",    /* 0x01 */
  18.     "SYN",    /* 0x02 */
  19.     "RST",    /* 0x04 */
  20.     "PSH",    /* 0x08 */
  21.     "ACK",    /* 0x10 */
  22.     "URG",    /* 0x20 */
  23.     "CE"    /* 0x40 */
  24. };
  25.  
  26.  
  27. /* Dump a TCP segment header. Assumed to be in network byte order */
  28. void
  29. tcp_dump (fp, bpp, source, dest, check)
  30. FILE *fp;
  31. struct mbuf **bpp;
  32. uint32 source,dest;    /* IP source and dest addresses */
  33. int check;        /* 0 if checksum test is to be bypassed */
  34. {
  35. struct tcp seg;
  36. struct pseudo_header ph;
  37. int16 csum;
  38. int16 dlen;
  39.  
  40.     if (bpp == NULLBUFP || *bpp == NULLBUF)
  41.         return;
  42.  
  43.     /* Verify checksum */
  44.     ph.source = source;
  45.     ph.dest = dest;
  46.     ph.protocol = TCP_PTCL;
  47.     ph.length = len_p (*bpp);
  48.     csum = cksum (&ph, *bpp, ph.length);
  49.  
  50.     (void) ntohtcp (&seg, bpp);
  51.  
  52.     traceprintf (fp, "TCP: %u->%u Seq x%lx", seg.source, seg.dest, seg.seq);
  53.     if (seg.flags.ack)
  54.         traceprintf (fp, " Ack x%lx", seg.ack);
  55.     if (seg.flags.congest)
  56.         traceprintf (fp, " %s", Tcpflags[6]);
  57.     if (seg.flags.urg)
  58.         traceprintf (fp, " %s", Tcpflags[5]);
  59.     if (seg.flags.ack)
  60.         traceprintf (fp, " %s", Tcpflags[4]);
  61.     if (seg.flags.psh)
  62.         traceprintf (fp, " %s", Tcpflags[3]);
  63.     if (seg.flags.rst)
  64.         traceprintf (fp, " %s", Tcpflags[2]);
  65.     if (seg.flags.syn)
  66.         traceprintf (fp, " %s", Tcpflags[1]);
  67.     if (seg.flags.fin)
  68.         traceprintf (fp, " %s", Tcpflags[0]);
  69.  
  70.     traceprintf (fp, " Wnd %u", seg.wnd);
  71.     if (seg.flags.urg)
  72.         traceprintf (fp, " UP x%x", seg.up);
  73.     /* Print options, if any */
  74.     if (seg.mss != 0)
  75.         traceprintf (fp, " MSS %u", seg.mss);
  76.     if ((dlen = len_p (*bpp)) != 0)
  77.         traceprintf (fp, " Data %u", dlen);
  78.     if (check && csum != 0)
  79.         traceprintf (fp, " CHECKSUM ERROR (%u)", csum);
  80.     traceprintf (fp, "\n");
  81. }
  82.  
  83.